﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MultiAgents
{
    public class Ogre : Agent
    {
        private int _pv; /*points de vie*/
        private const double TIME = 15.0;/*time before being allowed to have a child*/
       
        public Ogre(Program prg, Random random, float p, float p_2, float p_3, int pv) : base(prg,random, p, p_2, p_3)
        {
            _pv = pv;
            _nextMove = DateTime.Now.AddSeconds(TIME);/*un nouvel ogre n'a pas le droit d'avoir d'enfants avant un peu de temps*/
        }

        public void move()
        {
            /*si l'ogre veut trouver un autre ogre pour se reproduire, qu'il parte en chasse*/
           /* if (_hunt){base.hunt();}*/
            /*si l'ogre a une soudaine envie de partir en chasse, idem*/
           /* else if (_random.Next(0, 100) < HUNT_PROB){_hunt = true; base.hunt();}*/
            /*sinon, il fait une simple ballade aléatoire*/
            //else{
               base.move_random();// }

            /*Collision*/
            List<Agent> L = _program.isCollisioning(this);

            foreach (Agent A in L)
            {
                if (A.GetType().Equals(this.GetType())) /* si A est Ogre, 2 ogres se reproduisent! */
                {
                    Ogre Oo = ((Ogre)A);  /*Oo: le 2nd ogre en intéraction: */
                    /*  l'ogre disposant d'une position arbitraire est celui qui créé le nouvel ogre, dont la valeur de pv est la moyenne de celle de ses parents*/
                    /*afin d'eviter de se reproduire trop souvent pour cause de collision prolongée: attribut _nextMove: date d'autorisation à se reproduire*/

                    if ( (DateTime.Now >= _nextMove) && Oo.canIteract())
                    {
                        _hunt = false;
                        _nextMove = DateTime.Now.AddSeconds(TIME);
                        if (this.GetHashCode() > Oo.GetHashCode())
                            _program.addOgre((int)((Oo.getPv() + this._pv) / 2.0), getPosition());
                    }
                    
                }
                else /* Sinon, A est un robot, l'ogre va se faire taper/soigner */
                {
                    Robot Rr = ((Robot)A);
                    /*l'ogre se fait blesser ou soigner, en tout les cas ses pv varient de la puissance du robot*/
                    this._pv -= Rr.getPower() ; //Todo utilisation d'un modificateur de valeur dans la classe ? j'ai pas de notion d'esthétique en objet...                   
                    }
                }

            if (this._pv < 0)
            {
                //TODO DANGER: tuer l'ogre
                System.Console.WriteLine("Kill it!\n");
                _program.killMe(this);
            }
        }

        public int getPv()
        {
            return this._pv;
        }

        public bool canIteract()
        {
            return (this._nextMove <= DateTime.Now);
        }

    }
}
